{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import os\n",
    "from PIL import Image\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# this is nemo's \"core\" package\n",
    "import nemo\n",
    "# this is nemos's collection of GAN-related modules used for this example\n",
    "import nemo.collections.simple_gan as nemo_simple_gan"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define model parameters\n",
    "batch_size = 64\n",
    "data_root = \".\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Instantiate necessary Neural Modules"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "mnist_data = nemo_simple_gan.MnistGanDataLayer(\n",
    "    batch_size=batch_size,\n",
    "    shuffle=True,\n",
    "    train=True,\n",
    "    root=data_root\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:root:When constructing SimpleGenerator. The base NeuralModule class received the following unused arguments:\n",
      "WARNING:root:dict_keys(['batch_size'])\n"
     ]
    }
   ],
   "source": [
    "generator = nemo_simple_gan.SimpleGenerator(batch_size=batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "discriminator = nemo_simple_gan.SimpleDiscriminator()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "interpolater = nemo_simple_gan.InterpolateImage()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Loss_D = D(interpolated) - D(real) + lambda * GP\n",
    "disc_loss = nemo_simple_gan.DiscriminatorLoss()\n",
    "neg_disc_loss = nemo_simple_gan.DiscriminatorLoss(neg=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "disc_grad_penalty = nemo_simple_gan.GradientPenalty(lambda_=10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Describe how Neural Modules are connected together"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create generator DAG\n",
    "# Grab data from data layer\n",
    "latents, real_data, _ = mnist_data()\n",
    "# Generate image from latents\n",
    "generated_image = generator(latents=latents)\n",
    "# Define D(G(z)) where z represents the latents\n",
    "# generator_decision is a tensor that represents D(G(z))\n",
    "generator_decision = discriminator(image=generated_image)\n",
    "# Define loss_G = - mean(D(G(z)))\n",
    "generator_loss = neg_disc_loss(decision=generator_decision)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create discriminator DAG\n",
    "# Create interpolated image that is somewhere inbetween the real_image\n",
    "# and the generated image\n",
    "# Note: we reuse the generated_image tensor from the generator DAG\n",
    "interpolated_image = interpolater(image1=real_data, image2=generated_image)\n",
    "# Define D(x~) where x~ is the interpolated image\n",
    "interpolated_decision = discriminator(image=interpolated_image)\n",
    "# Define D(x) where x is the real image\n",
    "real_decision = discriminator(image=real_data)\n",
    "\n",
    "# Define the components of the discriminator loss\n",
    "# interpolated_loss = mean(D(x~))\n",
    "interpolated_loss = disc_loss(decision=interpolated_decision)\n",
    "# real_loss = - mean(D(x))\n",
    "real_loss = neg_disc_loss(decision=real_decision)\n",
    "# grad_penalty = mean(lambda* (|gradients| - 1) ** 2)\n",
    "grad_penalty = disc_grad_penalty(\n",
    "    interpolated_image=interpolated_image,\n",
    "    interpolated_decision=interpolated_decision)\n",
    "# Note the final loss_D = interpolated_loss + real_loss + grad_penalty"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create Eval DAG\n",
    "# Create a new datalayer that samples from the latent distribution\n",
    "random_data = nemo_simple_gan.RandomDataLayer(batch_size=batch_size)\n",
    "# Create a new NmTensor to get data from the data layer\n",
    "latents_e = random_data()\n",
    "# Generate from latents\n",
    "generated_image_e = generator(latents=latents_e)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Run training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create a neural factory\n",
    "neural_factory = nemo.core.NeuralModuleFactory(backend=nemo.core.Backend.PyTorch)\n",
    "trainer = neural_factory._trainer\n",
    "# Define the losses\n",
    "losses_G = [generator_loss]\n",
    "losses_D = [interpolated_loss, real_loss, grad_penalty]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Since we want optimizers to only operate on a subset of the model, we need\n",
    "# to manually create optimizers\n",
    "# For single loss and single optimizer, the following steps can be skipped\n",
    "# and an optimizer will be created in trainer.train()\n",
    "optimizer_G = trainer.create_optimizer(\n",
    "    optimizer=\"adam\",\n",
    "    things_to_optimize=[generator],\n",
    "    optimizer_params={\n",
    "        \"lr\": 1e-4,\n",
    "        \"betas\": (0.5, 0.9),\n",
    "    })\n",
    "optimizer_D = trainer.create_optimizer(\n",
    "    optimizer=\"adam\",\n",
    "    things_to_optimize=[discriminator],\n",
    "    optimizer_params={\n",
    "        \"lr\": 1e-4,\n",
    "        \"betas\": (0.5, 0.9),\n",
    "    })"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define some helper functions to log generated samples\n",
    "def save_image(global_vars):\n",
    "    images = global_vars[\"image\"]\n",
    "    image = images[0].squeeze(0).detach().cpu().numpy() * 255\n",
    "    plt.imshow(image, cmap=\"gray\")\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "def put_tensor_in_dict(tensors, global_vars):\n",
    "    global_vars[\"image\"] = tensors[generated_image_e.unique_name][0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Selected optimization level O0:  Pure FP32 training.\n",
      "\n",
      "Defaults for this optimization level are:\n",
      "enabled                : True\n",
      "opt_level              : O0\n",
      "cast_model_type        : torch.float32\n",
      "patch_torch_functions  : False\n",
      "keep_batchnorm_fp32    : None\n",
      "master_weights         : False\n",
      "loss_scale             : 1.0\n",
      "Processing user overrides (additional kwargs that are not None)...\n",
      "After processing overrides, optimization options are:\n",
      "enabled                : True\n",
      "opt_level              : O0\n",
      "cast_model_type        : torch.float32\n",
      "patch_torch_functions  : False\n",
      "keep_batchnorm_fp32    : None\n",
      "master_weights         : False\n",
      "loss_scale             : 1.0\n",
      "Warning:  multi_tensor_applier fused unscale kernel is unavailable, possibly because apex was installed without --cuda_ext --cpp_ext. Using Python fallback.  Original ImportError was: ModuleNotFoundError(\"No module named 'amp_C'\",)\n",
      "Doing Evaluation ..............................\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP8AAAD8CAYAAAC4nHJkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAGRtJREFUeJzt3XtwldW5BvDnNRguERAiRG4KIsqtXGykIsULKCLCILS1pdZLB6VjtT1WZ3rQM1OdqW319CilLdMRThG8UNBWB5yi4EGpXKQSLoKAAioUAiTcSiLXBN7zRzZOVL5nhSTsvZ31/GYYkv3wZi82+2Une31rLXN3iEh8zsr0AEQkM9T8IpFS84tESs0vEik1v0ik1PwikVLzi0RKzS8SKTW/SKQapPPOcnNzvXHjxrWub9iwYWJ26NAhWnvixAmaN2vWjOZ79+5NzJo2bVqn+87JyaF56O+Wm5ubmB05coTWhsYeqm/UqFGt6xs04E+/o0eP0rxJkya1rg/9e4eufK2oqKB5eXk5zZs3b56YHTx4kNayv3d5eTmOHDli9Auk1Kn5zWwogIkAcgD8r7s/zv5848aN0b9//8Q89IBfcskliVlRURGtDTXQ0KFDaT5t2rTE7Nprr6W1oX/MUAOuXbuW5h06dEjM1q9fT2sHDRpE8w0bNtC8a9euta5v3bo1rd20aRPN+/btS/NPPvkkMbvuuutobWVlJc137NhB88WLF9P8hhtuSMzeffddWtunT5/EbPbs2bS2ulp/229mOQAmAbgRQHcAY8yse22/noikV11+5u8HYLO7f+zuxwDMBDCyfoYlImdaXZq/HYBt1T7fnrrtc8xsnJkVmVnRsWPH6nB3IlKfzvi7/e4+2d0L3b2QvTElIulVl+YvBlD9nab2qdtE5CugLs2/HEAXM+tkZrkAvgdgTv0MS0TOtFpP9bl7pZndB2Aeqqb6prr7OlZjZnRud8SIEfQ+2ZTYwIEDae3f//53mofej/jhD3+YmF188cW09u2336Z5r169aD5s2DCas6mfiRMn0trRo0fTfObMmTS/+uqraX748OHEbPDgwbTWjE9Xs+s+AD5VGJqHz8/Pp3no3yyETc+G/l5t27atdW11dZrnd/e5AObW5WuISGbo8l6RSKn5RSKl5heJlJpfJFJqfpFIqflFIpXW9fwVFRUoKSlJzKdMmULr2ZJetkQSCK8NZ+urAT5X3707X8z4+uuv07xz5840v/fee2l+0003JWbLly+ntQcOHKD5okWLaN6yZUuad+vWLTGbN28erQ1dP1FczC8ofeeddxKzIUOG0NrQ3/vCCy+kec+ePWm+atWqxGzXrl20li19D+0zUJ1e+UUipeYXiZSaXyRSan6RSKn5RSKl5heJVFqn+po2bUp3ug1tp7xv377E7JVXXqG1oW2iQzvJsqWpoe3IQ8tDQzsLX3755TQfP358rTIgvGsxe8wB4P7776c52/W4Y8eOtDa0c/A999xD89LS0sQstF16KA/t/rtgwQKas6nCf/3rX7SWPd/OOqvmr+d65ReJlJpfJFJqfpFIqflFIqXmF4mUml8kUmp+kUildZ6/rKwM8+fPT8zbt29P69lcfGhJLpunB8Lba7do0SIxY8uUAWDnzp00f++992geOsU3tBSaYUePA3xJLgB861vfqvXXDx2xHTra/Omnn6Y5OyFqzZo1tLasrIzmocctdDrygAEDErPQseevvfZaYhZaol2dXvlFIqXmF4mUml8kUmp+kUip+UUipeYXiZSaXyRSxrYBDhabbQFQDuA4gEp3L2R/vqCgwMeMGZOYh7bAZsdo79ixg9YeP36c5qH12x988EFi1q9fP1ob2k459G+wevVqmrPts0Pz1ddffz3NlyxZQvNWrVrR/ODBg4lZ6Ej20JbnoS3Nf/e73yVmF110Ea198803ac6O2AbCzyc2l3/kyBFay47hnjFjBkpKSvjZ5in1cZHPte6+px6+joikkb7tF4lUXZvfAcw3sxVmNq4+BiQi6VHXb/u/6e7FZtYawBtm9oG7f+4i+dR/CuOA8DXqIpI+dXrld/fi1O+lAF4B8KV3vtx9srsXunthaKNLEUmfWje/meWZWdOTHwMYAuD9+hqYiJxZdfm2vwDAK2Z28uvMcHc+NyMiWaPWze/uHwPofZo1dK4+NLf64YcfJmbXXHMNrWVHIgPhI5d7907+q27fvp3Wrlixguah48UXLlxI8yuuuCIx27ZtG60NrdcP/agWOvr8rbfeSsy2bNlCa0NnLYQeF3ZtBjs/AgjvwRC6RmHGjBk0Z9dHrF27ltay58vpXLejqT6RSKn5RSKl5heJlJpfJFJqfpFIqflFIpXWrbvdPbi0lmnTpk1idvvtt9Pa0KXF/fv3pzk76vqJJ56gtR999BHN9+/fT/MePXrQ/OGHH07M7rrrLlrbqVMnms+dO5fmbCoP4NN5Y8eOpbWh6bJ169bRvEuXLonZ6WxxfSqjRo2ieWg793bt2iVmu3fvprXsuRjagr46vfKLRErNLxIpNb9IpNT8IpFS84tESs0vEik1v0ik6rR19+lq3ry5s6OJQ9cAsC2N+/btS2vZscZAeAvrrl27JmZ//OMfaS073hsA8vPzaR6ak2bXP4TmwkNLdtnXBsJHo7P7Hz58OK1dtmwZzUPbZ7NjskPbxIeuvQgthQ4d0X3VVVclZqFrJyorKxOzpUuX4sCBAzXauluv/CKRUvOLRErNLxIpNb9IpNT8IpFS84tESs0vEqm0rudv2LAhOnfunJiH5k6fe+65xOySSy6htYcPH6Z5QUEBzdkx2Y899hitXblyJc2vvPJKmm/YsIHmqbMTTik0j8+O9wbC1xh8//vfp/nUqVNpzlx66aU0Z88lgO/h0LZtW1q7efNmmoeeL7t27aI5E+oDdrx46PqC6vTKLxIpNb9IpNT8IpFS84tESs0vEik1v0ik1PwikQrO85vZVADDAZS6e8/UbS0BzALQEcAWALe4O18Ajao54zlz5iTmxcXFtJ7Nf4aO4F66dCnNR44cSfMTJ04kZps2baK1Z599Ns2ffvppmpeVldG8LnvAf/zxxzQPHaMd2g+CrfcPHU0+aNAgmj/wwAM0Z49bkyZNaO3Bgwdp/tRTT9G8devWNGfPidC/CdvXgmVfVJNX/mkAhn7htvEAFrh7FwALUp+LyFdIsPnd/W0A+75w80gA01MfTwdwcz2PS0TOsNr+zF/g7jtTH+8CwK91FJGsU+dr+93dzSzxBz8zGwdgHADk5OTU9e5EpJ7U9pW/xMzaAEDq99KkP+juk9290N0L1fwi2aO2zT8HwB2pj+8AMLt+hiMi6RJsfjP7C4B3AFxqZtvNbCyAxwFcb2abAFyX+lxEvkKCP/O7+5iEaPDp3lleXh6+8Y1vJObnnHMOrT927FhiFlrPf8EFF9C8WbNmNGfXEYwZk/QQVZkwYQLN2R7uALB48WKasznrYcOG0Vq2NhwAfvzjH9N88GD+NGDXMISuIWDn0APAkCFDaP7LX/4yMQs9Lu+//z7NJ02aRHO2/wMA7N27NzHr2bMnrWXnPDRoUPO38XSFn0ik1PwikVLzi0RKzS8SKTW/SKTU/CKRSuvW3YcOHaLbWN9+++20/t13303MNm7cSGtbtWpF84ceeojmF198cWL285//nNaGtmJesmQJzRcuXEjzJ598MjFbtGgRrZ0xYwbN9+zZQ/PQVtFbt25NzELTaa+++irNzz33XJq/8cYbiVloS/LQFCh7LobuG+BHwj/zzDO0lh1zH9qivjq98otESs0vEik1v0ik1PwikVLzi0RKzS8SKTW/SKTSOs+fl5eH/v37J+aHDh2i9WzZbnl5Oa0NbZ8dmlstLU3crAj79/Ndy0NjY9tbA+Glzmyb6B07dtDaG2+8kea33norzdesWUNztjw1NNf+k5/8hObnn38+zdny8VGjRtHa0Dx9aKv3Tz/9lObs+oi7776b1u7cuTMx05JeEQlS84tESs0vEik1v0ik1PwikVLzi0RKzS8SqbTO8x87dgzbt29PzENzlB988EFiFtqKefny5TQPrVtnc6vf+c53aO1bb71F89DW3V27dqV5SUlJYtavXz9aG7oGITT2gQMH0pwd4f3666/TWrb3AxC+BqFXr161vu/jx4/TPLQ190cffURzds1KaKt2tnV3ZWUlra1Or/wikVLzi0RKzS8SKTW/SKTU/CKRUvOLRErNLxKp4Dy/mU0FMBxAqbv3TN32KIC7AexO/bGH3X1u6Gvl5OTQtemhOWl2rPHXvvY1Wrt06VKah46iZsdsf/e736W1s2bNonloPwC2BwLA1/OzI7IB4De/+Q3Nly1bRvNf//rXNL/tttsSs5deeonWvvnmmzTv0aMHzdetW5eYPfvss7Q2lJeVldGcHScP8L0G2LgB4K677krMQtdGVFeTV/5pAIae4vYJ7t4n9SvY+CKSXYLN7+5vA9iXhrGISBrV5Wf++8xsjZlNNbMW9TYiEUmL2jb/nwB0BtAHwE4AiYfFmdk4Mysys6LQz0Eikj61an53L3H34+5+AsAUAInv1Ln7ZHcvdPfC3Nzc2o5TROpZrZrfzNpU+3QUAH7cqohknZpM9f0FwDUAzjOz7QAeAXCNmfUB4AC2APjRGRyjiJwBweZ39zGnuPnPtbmzyspK7NuXPHEQmvf95JNPErPQHvChfdhbtODvWR49ejQxC+0vHzozoEOHDjTfuHEjzXv37l2rDAifM3/ppZfS/Le//S3Nd+/enZjNmTOH1r766qs0D62pZ+vi2bgAoGHDhjQPrfffvHkzzefNm5eYbd26ldayf7ODBw/S2up0hZ9IpNT8IpFS84tESs0vEik1v0ik1PwikUrr1t0NGjRAy5YtE/MbbriB1rPlim3btqW1ffv2pfm2bdto3rlz58Ts5ptvprW/+tWvaB7amrtVq1Y0Z9NGbLtzAGjSpEmd8pycHJqzaU72XACAH/zgBzQfMWIEzZ9//vnEbPjw4bR27dq1ND/vvPNozp4vAF/Se+WVV9LaTZs2JWahKcjq9MovEik1v0ik1PwikVLzi0RKzS8SKTW/SKTU/CKRSus8//Hjx+mR0B9++CGtZ8dsh5YyFhQU0Lxbt240Z8tDV6xYQWtD/v3vf9P8hRdeoPnQoafaXLnKrl27aG3oOgC21TrAtw0H+DUKq1atorWhZdgzZsygeffu3ROzl19+mdayaycAIC8vr045O47+mWeeobWjR49OzE6cOEFrq9Mrv0ik1PwikVLzi0RKzS8SKTW/SKTU/CKRUvOLRCqt8/xmhrPOSv7/xsxo/ZEjRxIzdhQ0ACxatIjmbE4YAIqLixOzCy+8kNbu2bOH5mx9NgC0adOG5mxb8dB884MPPkjz0OP6wAMP0PzFF19MzEJr4ps1a0bz8ePH03zSpEmJWa9evWhtaMvy0P4QobGxazNuuukmWhvaQ6Gm9MovEik1v0ik1PwikVLzi0RKzS8SKTW/SKTU/CKRCs7zm1kHAM8CKADgACa7+0QzawlgFoCOALYAuMXd97OvVVFRQY9G3rlzJx1Lly5dErMpU6bQWraPABDep72srCwxKyoqorWhfflD67fz8/NpzsZ+2WWX0drQXgGh48WnT59Oc3aNQkVFBa0NHaPNrr0AgEaNGiVmlZWVtDZ0jkPozIHQdQJs/4kFCxbQWvZ8Ytd8fFFNXvkrATzo7t0BXAHgXjPrDmA8gAXu3gXAgtTnIvIVEWx+d9/p7itTH5cD2ACgHYCRAE7+tz8dAD+2RkSyymn9zG9mHQH0BfBPAAXufvL79F2o+rFARL4iatz8ZnYOgL8BuN/dP/cDsLs7qt4POFXdODMrMrOi0zlHTETOrBo1v5mdjarGf8HdT+58WGJmbVJ5GwClp6p198nuXujuhfW1IEFE6i7Y/Fa11O7PADa4+1PVojkA7kh9fAeA2fU/PBE5U2qypHcAgNsArDWz1anbHgbwOIAXzWwsgK0Abgl9ofz8fLpE9NixY7S+pKQkMevfvz+t/cMf/kDzgQMH0nz9+vWJWeho8dmz+f+LDz30EM1DUz/f/va3E7O5c+fS2tA04nXXXUfz9u3b0/zAgQOJWegI7tBS6NC24/v3J888h6YJQ1OcTZs2pfk999xD861btyZmo0aNorXseO8NGzbQ2uqCze/uiwEkLbQfXON7EpGsoiv8RCKl5heJlJpfJFJqfpFIqflFIqXmF4lUWrfuLi8vx8KFCxPz3r1703o2N/vSSy/R2sOHD9O8tPSUFyh+hi3BDC0nPv/882kems9m89UAv/5h7969tDY0z79lyxaah44XP3ToUGI2YcIEWsu2ageA5s2b05wtEX/vvfdobWi79CFDhtD8vvvuozmbqw9dm7Fs2bLELPQ8rk6v/CKRUvOLRErNLxIpNb9IpNT8IpFS84tESs0vEqm0zvM3atSIbjsc2rqbral/+eWXEzMAmDp1Ks0HDBhA89deey0xu/XWW2ntihUraB7aRrpbt240Hz16dGIWur4hdG1FaPvsO++8k+a///3vE7MLLriA1obW1F977bU0Z9dXhP69H3vsMZpv3ryZ5uz6BoBv7d24cWNay8b+i1/8gtZWp1d+kUip+UUipeYXiZSaXyRSan6RSKn5RSKl5heJlFWdtJUeubm53rp168Q8dKJP9+7dE7N+/frR2jlz5tC8R48eNGf7rH/961+ntUuWLKF5q1ataD5v3jyaP/LII4lZaG/70BFqofnqvLw8mrP58LFjx9La0HkFbdu2pTm7tmPo0KG0NnQNQoMG/BKZEydO0Jw9Jzp16kRrzz333MTsr3/9K0pLS5O22v8cvfKLRErNLxIpNb9IpNT8IpFS84tESs0vEik1v0ikguv5zawDgGcBFABwAJPdfaKZPQrgbgAnF3w/7O50w/GmTZti0KBBiXnnzp3pWNj+9WweHgB++tOf0vzxxx+nOVuzH5rzDa0dD81Xd+nSheZs//rQ3vb9+/en+aJFi2ge+rtNmzYtMWvXrh2t7dmzJ82PHj1K82HDhiVm7HoTIDzX3qxZM5qH9nBg+yiE9t5n1yDk5ubS2upqsplHJYAH3X2lmTUFsMLM3khlE9z9f2p8byKSNYLN7+47AexMfVxuZhsA8P+yRSTrndbP/GbWEUBfAP9M3XSfma0xs6lm1iKhZpyZFZlZUejbNBFJnxo3v5mdA+BvAO539zIAfwLQGUAfVH1n8OSp6tx9srsXunthw4YN62HIIlIfatT8ZnY2qhr/BXd/GQDcvcTdj7v7CQBTAPCVNSKSVYLNb2YG4M8ANrj7U9Vur36M6SgA79f/8ETkTKnJu/0DANwGYK2ZrU7d9jCAMWbWB1XTf1sA/Cj0hY4fP459+/YlDyYwZbZq1arErGPHjrT2ueeeo/mIESNovnHjxsTs8ssvp7WhJb2h7bPLyspozpZCh44uD22PXdclwezrz5w5k9bu2rWL5ldffTXN2bbjbHk4AMyePZvmoSW/bNktwKdgq15vkz3//POJWehI9upq8m7/YgCnGg0/RFxEspqu8BOJlJpfJFJqfpFIqflFIqXmF4mUml8kUmk9otvd6ZbGR44cofXsSOa+ffvS2vnz59M8tLx01qxZidmkSZNobWgL6tCy2H/84x80Z/P8l112Ga3Nz8+neUVFBc1D1zg0adIkMWvR4pTLQT6zcuVKmhcXF9OczcXXdZ6+T58+NJ84cSLNf/aznyVmoetCBg8enJiFjlSvTq/8IpFS84tESs0vEik1v0ik1PwikVLzi0RKzS8SqbQe0W1muwFU32P7PAB70jaA05OtY8vWcQEaW23V59gudHd+5ntKWpv/S3duVuTuhRkbAJGtY8vWcQEaW21lamz6tl8kUmp+kUhluvknZ/j+mWwdW7aOC9DYaisjY8voz/wikjmZfuUXkQzJSPOb2VAz+9DMNpvZ+EyMIYmZbTGztWa22syKMjyWqWZWambvV7utpZm9YWabUr/zdbHpHdujZlaceuxWm1nyMblndmwdzOwtM1tvZuvM7D9St2f0sSPjysjjlvZv+80sB8BGANcD2A5gOYAx7r4+rQNJYGZbABS6e8bnhM3sKgCfAnjW3XumbvtvAPvc/fHUf5wt3P0/s2RsjwL4NNMnN6cOlGlT/WRpADcDuBMZfOzIuG5BBh63TLzy9wOw2d0/dvdjAGYCGJmBcWQ9d38bwBdPORkJYHrq4+moevKkXcLYsoK773T3lamPywGcPFk6o48dGVdGZKL52wHYVu3z7ciuI78dwHwzW2Fm4zI9mFMoSB2bDgC7ABRkcjCnEDy5OZ2+cLJ01jx2tTnxur7pDb8v+6a7XwbgRgD3pr69zUpe9TNbNk3X1Ojk5nQ5xcnSn8nkY1fbE6/rWyaavxhAh2qft0/dlhXcvTj1eymAV5B9pw+XnDwkNfV7aYbH85lsOrn5VCdLIwseu2w68ToTzb8cQBcz62RmuQC+B2BOBsbxJWaWl3ojBmaWB2AIsu/04TkA7kh9fAcAfqJkGmXLyc1JJ0sjw49d1p147e5p/wVgGKre8f8IwH9lYgwJ47oIwHupX+syPTYAf0HVt4EVqHpvZCyAfAALAGwC8H8AWmbR2J4DsBbAGlQ1WpsMje2bqPqWfg2A1alfwzL92JFxZeRx0xV+IpHSG34ikVLzi0RKzS8SKTW/SKTU/CKRUvOLRErNLxIpNb9IpP4f3v6G+7uBrw0AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f0d68f1be48>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Evaluation time: 1.2685503959655762 seconds\n",
      "Doing Evaluation ..............................\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f0d68f275c0>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Evaluation time: 1.210198163986206 seconds\n",
      "Doing Evaluation ..............................\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f0ca8427128>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Evaluation time: 1.2725772857666016 seconds\n",
      "Doing Evaluation ..............................\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f0cc0a5a358>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Evaluation time: 1.2323925495147705 seconds\n",
      "Doing Evaluation ..............................\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f0cc0a53e10>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Evaluation time: 1.268960952758789 seconds\n",
      "Doing Evaluation ..............................\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f0d68f27438>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Evaluation time: 1.2771921157836914 seconds\n",
      "Doing Evaluation ..............................\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f0cc0a679e8>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Evaluation time: 1.2810349464416504 seconds\n",
      "Doing Evaluation ..............................\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f0d6869b4e0>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Evaluation time: 1.354567289352417 seconds\n",
      "Doing Evaluation ..............................\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP8AAAD8CAYAAAC4nHJkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAADRpJREFUeJzt3W/IXvV9x/H3N9GgpgF1upugbmYlLgQfxBFkQhjKluIkEPtEqk8yVpo+qLjKHkzcgwljUMbqKCKFlEqjVOvAiKGWtV0Y0+JSk4jzX1LNSqQJ0VQsmGpMTPLdg/tk3DW5znXn+neu2+/7BTf3dZ3v9efLST73uc71O+f8IjORVM+irhuQ1A3DLxVl+KWiDL9UlOGXijL8UlGGXyrK8EtFGX6pqAsm+WYR4eGE0phlZszncUNt+SPi1oj4RUTsj4j7hnktSZMVgx7bHxGLgTeB9cBBYBdwZ2a+0fIct/zSmE1iy38jsD8zf5mZJ4AfABuHeD1JEzRM+K8CfjXn/sFm2e+IiM0RsTsidg/xXpJGbOxf+GXmFmAL+LFfmibDbPkPAdfMuX91s0zSAjBM+HcBKyNiRUQsAb4EbB9NW5LGbeCP/Zl5MiLuBn4MLAYeyczXR9aZpLEaeKhvoDdzn18au4kc5CNp4TL8UlGGXyrK8EtFGX6pKMMvFWX4paIMv1SU4ZeKMvxSUYZfKsrwS0UZfqkowy8VZfilogy/VJThl4oy/FJRhl8qyvBLRRl+qSjDLxVl+KWiDL9UlOGXijL8UlGGXyrK8EtFGX6pqIGn6AaIiAPAUeAUcDIz146iKX12zMzM9KytWLGi9bk7d+4cdTuaY6jwN27JzPdG8DqSJsiP/VJRw4Y/gZ9ExJ6I2DyKhiRNxrAf+9dl5qGI+H3gpxGxLzOfm/uA5o+CfxikKTPUlj8zDzW/jwBPAzee4zFbMnOtXwZK02Xg8EfE0ohYduY28AXgtVE1Jmm8hvnYPwM8HRFnXufxzPz3kXQlaewiMyf3ZhGTe7MRW7JkSc/aiy++2PrcG264obU+yX+DUXvyySdb6xs3buxZO336dOtzL7nkkoF6qi4zYz6Pc6hPKsrwS0UZfqkowy8VZfilogy/VNQozuor4aGHHupZO3r0aOtzF/JQ3uLFi1vr1113XWt90aLe25d9+/YN1JNGwy2/VJThl4oy/FJRhl8qyvBLRRl+qSjDLxXlKb3ztGzZsp61Dz/8sPW5/U5dXchWrVrVWr/66qt71l544YXW53700UcD9VSdp/RKamX4paIMv1SU4ZeKMvxSUYZfKsrwS0U5zq+hXHrppa31tkuev/de++TOn+XjI8bJcX5JrQy/VJThl4oy/FJRhl8qyvBLRRl+qai+1+2PiEeADcCRzLy+WXY58CRwLXAAuCMzfzO+NtWViPYh43vuuae1vm3btp61fvMdHDt2rLWu4cxny/894NZPLbsP2JGZK4EdzX1JC0jf8Gfmc8D7n1q8Edja3N4K3D7iviSN2aD7/DOZebi5/Q4wM6J+JE3I0HP1ZWa2HbMfEZuBzcO+j6TRGnTL/25ELAdofh/p9cDM3JKZazNz7YDvJWkMBg3/dmBTc3sT8Mxo2pE0KX3DHxFPAP8N/HFEHIyILwPfANZHxFvAXzT3JS0gns+vVtu3b2+tb9iwobV+6tSpnrU9e/a0Pvfmm29urX/88cet9bZjFCb5/37SPJ9fUivDLxVl+KWiDL9UlOGXijL8UlEO9RX34IMPttbvvffeCXVytl27drXW169f31o/ceJEz1q/YcKFPBToUJ+kVoZfKsrwS0UZfqkowy8VZfilogy/VJTj/MV98sknrfULLhj6Sm8DazsdGGDFihWt9SNHel5giuPHjw/U00LgOL+kVoZfKsrwS0UZfqkowy8VZfilogy/VFR3g7iaCl2O4/fTb5y/X/2zPJY/Cm75paIMv1SU4ZeKMvxSUYZfKsrwS0UZfqmovoO8EfEIsAE4kpnXN8seAL4C/Lp52P2Z+aNxNanx6TdWvnjx4gl1craTJ0+21tvO11d/89nyfw+49RzL/zUz1zQ/Bl9aYPqGPzOfA96fQC+SJmiYff67I+KViHgkIi4bWUeSJmLQ8H8b+DywBjgMfLPXAyNic0TsjojdA76XpDEYKPyZ+W5mnsrM08B3gBtbHrslM9dm5tpBm5Q0egOFPyKWz7n7ReC10bQjaVLmM9T3BHAzcEVEHAT+Abg5ItYACRwAvjrGHiWNgdftL+6DDz5orS9btmxCnZzt6NGjrfUrrriitX7ixIlRtrNgeN1+Sa0Mv1SU4ZeKMvxSUYZfKsrwS0VN73WbNW8RvUd2+l2ae+fOna31m266qbW+dOnS1nqb06dPt9YPHDjQWq86lDcqbvmlogy/VJThl4oy/FJRhl8qyvBLRRl+qShP6Z0CV155ZWv9rrvuaq0/++yzPWv79+9vfW6/4wD6Xbr78ccfb61fdNFFPWtr1qxpfe4tt9zSWn/zzTdb61V5Sq+kVoZfKsrwS0UZfqkowy8VZfilogy/VJTj/PO0aFHvv5P9prket7b3v/DCC1ufO+y/f9u1BAAuvvjinrV+xze8/fbbA/VUneP8kloZfqkowy8VZfilogy/VJThl4oy/FJRfa/bHxHXAI8CM0ACWzLzWxFxOfAkcC1wALgjM38zvlbHq+28c4Bjx45NqJPz1++c+3Ea5jiBDRs2tNYffvjhgV9b/c1ny38S+NvMXA38KfC1iFgN3AfsyMyVwI7mvqQFom/4M/NwZr7U3D4K7AWuAjYCW5uHbQVuH1eTkkbvvPb5I+Ja4Abg58BMZh5uSu8wu1sgaYGY91x9EfE54Cng65n5wdxjujMzex23HxGbgc3DNipptOa15Y+IC5kN/vczc1uz+N2IWN7UlwNHzvXczNySmWszc+0oGpY0Gn3DH7Ob+O8CezPzwTml7cCm5vYm4JnRtydpXPqe0hsR64DngVeBM3Mq38/sfv+/AX8AvM3sUN/7fV5rak/pff7551vr69atm1An56/t8twrV66cYCfnZ8mSJa11p+AezHxP6e27z5+ZPwN6vdifn09TkqaHR/hJRRl+qSjDLxVl+KWiDL9UlOGXipr34b2fdY899lhrfZrH+ad5LL+N4/jdcssvFWX4paIMv1SU4ZeKMvxSUYZfKsrwS0U5Rfc8HT9+vGet33np/ezdu7e1vnr16qFeX7U4RbekVoZfKsrwS0UZfqkowy8VZfilogy/VJTj/COwatWq1vq+ffsm1InkOL+kPgy/VJThl4oy/FJRhl8qyvBLRRl+qai+4/wRcQ3wKDADJLAlM78VEQ8AXwF+3Tz0/sz8UZ/X+kyO80vTZL7j/PMJ/3JgeWa+FBHLgD3A7cAdwG8z81/m25Thl8ZvvuHvO2NPZh4GDje3j0bEXuCq4dqT1LXz2uePiGuBG4CfN4vujohXIuKRiLisx3M2R8TuiNg9VKeSRmrex/ZHxOeA/wL+KTO3RcQM8B6z3wP8I7O7Bn/d5zX82C+N2cj2+QEi4kLgh8CPM/PBc9SvBX6Ymdf3eR3DL43ZyE7siYgAvgvsnRv85ovAM74IvHa+TUrqzny+7V8HPA+8CpxuFt8P3AmsYfZj/wHgq82Xg22v5ZZfGrORfuwfFcMvjZ/n80tqZfilogy/VJThl4oy/FJRhl8qyvBLRRl+qSjDLxVl+KWiDL9UlOGXijL8UlGGXyqq7wU8R+w94O05969olk2jae1tWvsCexvUKHv7w/k+cKLn85/15hG7M3NtZw20mNbeprUvsLdBddWbH/ulogy/VFTX4d/S8fu3mdbeprUvsLdBddJbp/v8krrT9ZZfUkc6CX9E3BoRv4iI/RFxXxc99BIRByLi1Yh4uespxppp0I5ExGtzll0eET+NiLea3+ecJq2j3h6IiEPNuns5Im7rqLdrIuI/I+KNiHg9Iv6mWd7pumvpq5P1NvGP/RGxGHgTWA8cBHYBd2bmGxNtpIeIOACszczOx4Qj4s+A3wKPnpkNKSL+GXg/M7/R/OG8LDP/bkp6e4DznLl5TL31mln6r+hw3Y1yxutR6GLLfyOwPzN/mZkngB8AGzvoY+pl5nPA+59avBHY2tzeyux/nonr0dtUyMzDmflSc/socGZm6U7XXUtfnegi/FcBv5pz/yDTNeV3Aj+JiD0RsbnrZs5hZs7MSO8AM102cw59Z26epE/NLD01626QGa9HzS/8zrYuM/8E+Evga83H26mUs/ts0zRc823g88xO43YY+GaXzTQzSz8FfD0zP5hb63LdnaOvTtZbF+E/BFwz5/7VzbKpkJmHmt9HgKeZ3U2ZJu+emSS1+X2k437+X2a+m5mnMvM08B06XHfNzNJPAd/PzG3N4s7X3bn66mq9dRH+XcDKiFgREUuALwHbO+jjLBGxtPkihohYCnyB6Zt9eDuwqbm9CXimw15+x7TM3NxrZmk6XndTN+N1Zk78B7iN2W/8/xf4+y566NHXHwH/0/y83nVvwBPMfgz8hNnvRr4M/B6wA3gL+A/g8inq7TFmZ3N+hdmgLe+ot3XMfqR/BXi5+bmt63XX0lcn680j/KSi/MJPKsrwS0UZfqkowy8VZfilogy/VJThl4oy/FJR/wf05HumL56CaQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f0d68e13630>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Evaluation time: 1.2980642318725586 seconds\n",
      "Doing Evaluation ..............................\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f0d68ecacc0>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Evaluation time: 1.2718994617462158 seconds\n",
      "Final Evaluation ..............................\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f0d690763c8>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Define a callback that generates samples\n",
    "eval_callback = nemo.core.EvaluatorCallback(\n",
    "    eval_tensors=[generated_image_e],\n",
    "    user_iter_callback=put_tensor_in_dict,\n",
    "    user_epochs_done_callback=lambda x: save_image(x),\n",
    "    eval_step=1000,\n",
    ")\n",
    "\n",
    "# Define our training loop. Here we optimize take 3 discriminator steps\n",
    "# prior to taking the generator step\n",
    "tensors_to_optimize = [\n",
    "    (optimizer_D, losses_D),\n",
    "    (optimizer_D, losses_D),\n",
    "    (optimizer_D, losses_D),\n",
    "    (optimizer_G, losses_G),\n",
    "]\n",
    "\n",
    "# Finally, call train with our training loop and callbacks\n",
    "trainer.train(\n",
    "    tensors_to_optimize=tensors_to_optimize,\n",
    "    callbacks=[eval_callback],\n",
    "    optimization_params={\"num_epochs\": 10})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
